package com.jg.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author 86130
 * @version 1.0
 * @description: TODO
 * @date 2025/6/5 上午8:54
 */
@Component  //交给spring容器管理
@Aspect // 表示当前类是一个切面类
public class MyAdvice {
    // 定义切点 表示在UserMapper接口的getList方法上进行切面处理
    // @Pointcut:   定义切点
    // execution(返回值类型 包名.类名.方法名(参数列表))
    @Pointcut("execution(public * com.jg.mapper.*.*(..))")
    public void pt(){}
    // 制作切面
    // @Before: 前置通知
    @Before("pt()")
    public void before(JoinPoint point){
        System.out.println("前置通知");
        // 获取调用时间
        System.out.println("调用时间："+System.currentTimeMillis());
        // 获取调用类的全限定名
        System.out.println("类名："+point.getSignature().getDeclaringType().getName());
        // 获取方法参数
        Object[] args = point.getArgs();
        for (Object arg : args) {
            System.out.println("参数："+arg);
        }
        // 获取方法名
        System.out.println("方法名："+this.getClass().getName());
    }

    //  @After: 后置通知
    @After("pt()")
    public void after(){
        System.out.println("后置通知");
        System.out.println("调用时间："+System.currentTimeMillis());
    }

    // @Around: 环绕通知
    //@Around("pt()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕通知");
        // 获取调用方法的类名
        System.out.println("类名："+pjp.getSignature().getDeclaringType().getName());
        // 获取方法名
        System.out.println("方法名："+pjp.getSignature().getName());
        // 获取参数
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            System.out.println("参数："+arg);
        }
        System.out.println("调用时间："+System.currentTimeMillis());
        // 调用方法
        pjp.proceed();
        System.out.println("结束时间："+System.currentTimeMillis());
    }

    //  @AfterThrowing: 异常通知
    //  value: 监控的方法
    //  throwing: 获取异常
    //@AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(JoinPoint point,Exception e) throws Throwable{
        System.out.println("异常通知");
        System.out.println("调用类名:"+point.getTarget().getClass().getName());
        System.out.println("调用方法名:"+point.getSignature().getName());
        // 获取异常信息
        System.out.println("异常信息:"+e.getMessage());
        // 将异常信息发送到钉钉群
    }
}
